# PromptTemplate 的使用
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

prompt = PromptTemplate.from_template("你是一个起名大师，帮我起一个具有{country}特色的男孩名字")
pmt = prompt.format(country="法国")
print(pmt)

# 对话模版结构 ChatPromptTemplate
from langchain.prompts import ChatPromptTemplate

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个起名大师，你的名字是{name}"),
    ("human", "你好{name}, 你感觉如何？"),
    ("ai", "你好！我状态很好!"),
    ("human", "{user_input}")
])

pmt = chat_prompt.format(name="陈大师", user_input="你叫什么名字")
print(pmt)

# 直接创建信息
from langchain.schema import SystemMessage, HumanMessage, AIMessage, ChatMessage

sy = SystemMessage(
    content="你是一个起名大师",
    args={"大师姓名": "陈瞎子"}
)

hu = HumanMessage(content="请问大师叫什么")
ai = AIMessage(content="我叫陈瞎子")

print([sy, hu, ai])

# ChatMessagePromptTemplate
from langchain.prompts import ChatMessagePromptTemplate

prompt_str = "愿{subject}与你同在"
chat_msg_prompt = ChatMessagePromptTemplate.from_template(role="测试", template=prompt_str)
str = chat_msg_prompt.format(subject="原力")
print(str)

# 自定义模版
from langchain.prompts import StringPromptTemplate


# 定义一个简单的函数作为示例效果



PROMPT = """
    你是一个非常有经验和天赋的程序员，现在给你如下函数名称，你会按照格式输出这段代码的名称、源代码、中文解释。
    函数名称: {function_name}
    源代码：
    {source_code},
    代码解释：
"""
import inspect

def hello_world():
    print("hello, world!")

def get_source_code(function_name):
    return inspect.getsource(function_name)


class CustomPrompt(StringPromptTemplate):
    def format(self, **kwargs):
        # 获取源代码
        source_code = get_source_code(kwargs["function_name"])
        # 生成提示词模版
        prompt = PROMPT.format(
            function_name=kwargs["function_name"].__name__, source_code=source_code
        )
        return prompt


a = CustomPrompt(input_variables=["function_name"])
str = a.format(function_name=hello_world)
print(str)

model = ChatOpenAI(model="deepseek-r1-qwen-32b",
                   openai_api_key="ollama",
                   openai_api_base="http://10.2.42.9:8112/v1")

s = model.invoke(str)
print(s)